// #include <stdio.h>
// #include <stdlib.h>
// #include <stdbool.h>

// // 2. 统计一个 C 源文件的总行数、注释行、代码行、空行数

// // int main(int argc, char *argv[])
// // {
// //     FILE *fd = fopen(argv[1], "r");
// //     if (!fd)
// //     {
// //         printf("打开文件%s失败！\n", argv[1]);
// //         exit(1);
// //     }

// //     int row = 0;
// //     int comment_line = 0;
// //     int blank_line = 0;
// //     int code_line = 0;
// //     char line[256];
// //     while (fgets(line, sizeof(line), fd) != EOF)
// //     {
// //         row++;
// //         // 去除换行符以便于处理
// //         // strcspn 返回 s1 中第一个出现在 s2 中的字符的位置索引（即前面有多少个不匹配的字符）。
// //         line[strcspn(line, "\n")] = 0;
// //         if (strlen(line) == 0)
// //         {
// //             blank_line++;
// //         }
// //         else if (is_comment_line(line) || is_in_mulcomment_line(line))
// //         {
// //             comment_line++;
// //         }
// //         else
// //         {
// //             code_line++;
// //         }
// //     }
// //     printf("总函数：%d, 代码行：%d, 注释行：%d, 空行：%d\n", row, code_line, comment_line, blank_line);

// //     return 0;
// // }


// #define MAX_LINE 1024  // 假设一行最多有1024个字符

// int main(int argc, char *argv[]) {
//     int c;                     // 当前读取的字符
//     int line[MAX_LINE];        // 缓存一行的内容
//     int pos = 0;               // 当前行的字符位置索引

//     int total_lines = 0;       // 总行数
//     int code_lines = 0;        // 代码行数
//     int comment_lines = 0;     // 注释行数
//     int blank_lines = 0;       // 空行数

//     int in_single_line_comment = 0; // 是否在单行注释中 (//)
//     int in_multi_line_comment = 0;  // 是否在多行注释中 /* */
//     int inside_comment_block = 0;   // 标记该行是否部分属于注释块

//     int has_content = 0;       // 当前行是否有非空白字符（不是空行）
//     FILE *fd = fopen(argv[1], "r");
//     if (!fd)
//     {
//         printf("打开文件%s失败！\n", argv[1]);
//         exit(1);
//     }

//     // 开始读取输入
//     while ((c = fgetc(fd)) != EOF) {

//         // 将字符加入当前行的缓存
//         if (pos < MAX_LINE - 1) {
//             line[pos++] = c;
//         }

//         // 检查是否为换行符，即一行结束
//         if (c == '\n' || c == EOF) {
//             line[pos] = '\0';  // 行结尾标记
//             total_lines++;

//             // 如果这一行是空行（没有有效字符）
//             if (!has_content && !inside_comment_block && !in_multi_line_comment) {
//                 blank_lines++;
//             }

//             // 如果这一行全部在注释中 或 部分在注释中，则计为注释行
//             if (inside_comment_block || 
//                 (in_single_line_comment && !in_multi_line_comment)) {
//                 comment_lines++;
//             }

//             // 如果这一行包含代码内容且不在注释中，则是代码行
//             if (has_content && !inside_comment_block && !in_single_line_comment && !in_multi_line_comment) {
//                 code_lines++;
//             }

//             // 重置变量，准备下一行
//             pos = 0;
//             has_content = 0;
//             inside_comment_block = 0;

//             // 单行注释结束后要关闭状态
//             if (in_single_line_comment) {
//                 in_single_line_comment = 0;
//             }
//         }

//         // 检查是否进入单行注释 //
//         if (!in_multi_line_comment && !in_single_line_comment && c == '/') {
//             int next_c = getchar();
//             if (next_c == '/') {
//                 in_single_line_comment = 1;
//                 inside_comment_block = 1;
//             } else {
//                 // 不是注释，把下一个字符放回去
//                 ungetc(next_c, stdin);
//             }
//         }

//         // 检查是否进入多行注释 /*
//         if (!in_multi_line_comment && !in_single_line_comment && c == '/') {
//             int next_c = getchar();
//             if (next_c == '*') {
//                 in_multi_line_comment = 1;
//                 inside_comment_block = 1;
//             } else {
//                 // 把字符放回去
//                 ungetc(next_c, stdin);
//             }
//         }

//         // 检查是否退出多行注释 */
//         if (in_multi_line_comment && c == '*') {
//             int next_c = getchar();
//             if (next_c == '/') {
//                 in_multi_line_comment = 0;
//             } else {
//                 // 把字符放回去
//                 ungetc(next_c, stdin);
//             }
//         }

//         // 如果不是注释中的字符，并且不是空白字符，则认为有内容
//         if (!in_single_line_comment && !in_multi_line_comment &&
//             c != ' ' && c != '\t' && c != '\n' && c != '\r') {
//             has_content = 1;
//         }
//     }

//     // 输出结果
//     printf("总行数: %d\n", total_lines);
//     printf("空行数: %d\n", blank_lines);
//     printf("注释行数: %d\n", comment_lines);
//     printf("代码行数: %d\n", code_lines);

//     return 0;
// }